package jscontrol

import (
	"MqttCloudProtocolServer/ProtocolServer/scriptmanager/modulelib"
	"errors"

	"github.com/dop251/goja"
	"github.com/wonderivan/logger"
)

//CreateTimerModule fun
func CreateTimerModule(runtime *goja.Runtime) *goja.Object {
	content := new(TimerModule)
	content.timer = new(modulelib.TimeTicker)
	jsTimer := runtime.NewObject()
	err := jsTimer.Set("Init", content.init)
	if err != nil {
		logger.Error(err)
		return nil
	}
	err = jsTimer.Set("Start", content.start)
	if err != nil {
		logger.Error(err)
		return nil
	}
	err = jsTimer.Set("Stop", content.stop)
	if err != nil {
		logger.Error(err)
		return nil
	}
	err = jsTimer.Set("Close", content.close)
	if err != nil {
		logger.Error(err)
		return nil
	}
	err = jsTimer.Set("Elapsed", content.setElapsed)
	if err != nil {
		logger.Error(err)
		return nil
	}
	content.jsTimer = jsTimer
	content.runtime = runtime
	return jsTimer
}

//TimerModule 导入JS的定时器类库
type TimerModule struct {
	timer   *modulelib.TimeTicker
	elapsed goja.Callable
	jsTimer *goja.Object
	runtime *goja.Runtime
}

func (_this *TimerModule) init(call goja.FunctionCall) goja.Value {
	if len(call.Arguments) < 1 {
		return GetFromResAndErr(false, errors.New("参数长度错误"), _this.runtime)
	}
	durMillisecond, err := GetInt64FromArgument(call.Argument(0))
	if err != nil {
		return GetFromResAndErr(false, err, _this.runtime)
	}
	_this.timer.Init(durMillisecond)
	_this.timer.SetElapsed(func() {
		if _this.elapsed == nil {
			logger.Info("未设置连接成功回调函数")
			return
		}
		_this.elapsed(_this.jsTimer)
	})
	return GetFromResAndErr(true, nil, _this.runtime)
}
func (_this *TimerModule) start(call goja.FunctionCall) goja.Value {
	_this.timer.Start()
	return GetFromResAndErr(true, nil, _this.runtime)
}
func (_this *TimerModule) stop(call goja.FunctionCall) goja.Value {
	_this.timer.Stop()
	return GetFromResAndErr(true, nil, _this.runtime)
}
func (_this *TimerModule) close(call goja.FunctionCall) goja.Value {
	_this.timer.Close()
	return GetFromResAndErr(true, nil, _this.runtime)
}
func (_this *TimerModule) setElapsed(call goja.FunctionCall) goja.Value {
	if len(call.Arguments) < 1 {
		return GetFromResAndErr(false, errors.New("参数长度错误"), _this.runtime)
	}
	callbakFun, ok := goja.AssertFunction(call.Argument(0))
	if !ok {
		return GetFromResAndErr(false, errors.New("设置连接成功回调失败"), _this.runtime)
	}
	_this.elapsed = callbakFun
	return GetFromResAndErr(true, nil, _this.runtime)
}
